SETJMP

#include<setjmp.h>
int setjmp(env);
jmp_buf env;                   переменная, в  которой хранится окружение.

Описание.
Функция setjmp сохраняет состояние стека, который может быть последовательно восстановлен посредством использования функции longjmp .
Функции setjmp и longjmp обеспечивают возможность выполнения нелокального (nonlocal ) перехода и обычно используются для передачи управления к обработке ошибок для восстановления кода в ранее вызванной процедуре (без использования обычного вызова), для возврата условных обозначений. Вызов setjmp активизирует сох ранение текущего состояния стека в env . Последующий вызов longjmp восстанавливает сохраненное состояние и возвращает управление на указатель (точку входа), непосредственно следующий за соответствующим вызовом setjmp . Когда вызывается функция longjmp , значения всех переменных (за исключением переменных регистра) становятся доступными для процедуры, которая принимает управление и содержит значения этих переменных. Значения переменных регистра непредсказуемы.

Возвращаемое значение.
После сохранения состояния стека функция setjmp возвращает значение 0. Если в результате вызова longjmp возвращается setjmp , тогда возвращается и значение value аргумента longjmp . Возвращаемого значения в случае ошибки нет.

Замечание.
После выполнения longjmp значения переменных регистра в процедуре, вызывающей setjmp , не могут быть восстановлены (возвращены) к собственным значениям.

Пример:

            
            #include <stdio.h>
            #include <setjmp.h>
            
            jmp_buf mark;
            
            main()
                 {
                 if (setjmp(mark) != 0)
           
                 {   printf("longjmp has been called\n");
                     recover();
                     exit(1);
                  }
                 printf("setjmp has been called\n");
                 .
                 .
                 .
                 p();
                 .
                 .
                 .
                 }
                
            
                p()
                {
      
                int error = 0;
                .
                .
                .
                if (error != 0)
                   longjmp(mark, -1);
                .
                .
                .
                }
            
                recover()
                {
            
               /*  при  выходе из программы убедитесь, что файлы данных не
         будут запорчены */
            
                .
                .
                .
                }
           
           
Hosted by uCoz